<?php
Class Router {
	private $path;
	private $args = array();
	
	function setPath($path){
		$path = PHP_OS=="Linux"?DIRSEP.trim($path,DIRSEP):trim($path,DIRSEP);
		$path .= DIRSEP;
		if(is_dir($path)==false){
			throw new Exception ('Invalid controller path:'.$path.'');
		}
		$this->path = $path;
	}
	
	private function getController(&$file, &$controller, &$action, &$args, &$route){
		if(isset($route)==false||empty($route)){
			$route = empty($_GET['route']) ? '' : $_GET['route'];
		}
		if(empty($route)){
			$route = 'index';
		}
		// Получаем раздельные части
		$route = trim($route,'/\\');
		$parts = explode('/', $route);
		// Находим правильный контроллер
		$cmd_path = $this->path;
		foreach($parts as $part){
			$fullpath = $cmd_path.$part;
			// Есть ли папка с таким путём?
			if(is_dir($fullpath)){
				$cmd_path .= $part.DIRSEP;
				array_shift($parts);
				continue;
			}
			// Находим файл
			if(is_file($fullpath.'.php')){
				$controller = $part;
				array_shift($parts);
				break;
			}
		}
		
		if(empty($controller)){
			$controller = 'index';
		};
		// Получаем действие
		$action = array_shift($parts);
		if(empty($action)){
			$action = 'index';
		}
		$file = $cmd_path.$controller.'.php';
		$args = $parts;
	}
	
	function delegate($r=false,$arg=''){
		//Анализируем путь
		if(isset($r)==false){
			$route = '';
		}else{
			$route = $r;
		}
		$this->getController($file,$controller,$action,$args,$route);
		
		
		// Файл доступен?
		if(is_readable($file)==false){
			header("HTTP/1.0 404 Not Found");
			die('404 Not Found '.$file);
		}
		// Подключаем файл
		include_once($file);
		// Создаём экземпляр контроллера
		$class = 'Controller_'.$controller;
		$controller = new $class();
		// Действие доступно?
		if(is_callable(array($controller,$action))==false){
			header("HTTP/1.0 404 Not Found");
			die('404 Not Found'.$file." ".$action);
		}
		// Выполняем действие
		$res = $controller->$action($arg);
		if(isset($res)){
			return $res;
		}
	}
}
?>